import os
import re
import datetime

from openpyxl.styles.builtins import output

import tools
from pathlib import Path
import pandas as pd

from pandas import DataFrame, Series

from tools import BASE_PATH_5G生态应用技术

pd.set_option('display.unicode.east_asian_width', True)

"""
获得指定目录下的所有文件的名称
返回:
    list: 包含所有 .docx 文件名的列表
"""


def get_docx_files(folder_path, return_type="name_only"):
    try:
        # 验证文件夹是否存在
        if not os.path.isdir(folder_path):
            print(f"错误: 文件夹不存在 - {folder_path}")
            return []

        folder = Path(folder_path)
        docx_files = []

        iterator = folder.iterdir()

        # 收集所有 .docx 文件
        for item in iterator:
            if item.is_file() and item.suffix.lower() == '.docx':
                # 根据返回类型处理路径
                if return_type == "full_path":
                    docx_files.append(str(item.absolute()))
                elif return_type == "name_only":
                    docx_files.append(item.name)
                elif return_type == "relative":
                    docx_files.append(str(item.relative_to(folder)))
                else:
                    docx_files.append(str(item.absolute()))

        # 按文件名排序
        docx_files.sort()

        print(f"在 {folder_path} 中找到 {len(docx_files)} 个 .docx 文件")
        return docx_files

    except Exception as e:
        print(f"获取文件列表时出错: {str(e)}")
        return []


"""
返回文件名称中的姓名部分
"""


def get_姓名_segment(file_paths):
    results = []
    for file_path in file_paths:
        # 分割文件名
        parts = file_path.split('.')
        segments = parts[0].split('-')
        if len(segments) >= 2:  # 检查是否有足够的段
            姓名_segment = segments[2]  # 获取第二段（索引为1）
            results.append(姓名_segment)
        else:
            # 如果没有足够的分段，记录错误
            results.append("ERROR: 文件名格式不符合要求")

    return results


"""
返回文件名称中的学号部分
"""


def get_学号_segment(file_paths):
    results = []
    for file_path in file_paths:
        # 分割文件名
        segments = file_path.split('-')

        # 检查是否有足够的段
        if len(segments) >= 3:
            # 获取第二段（索引为1）
            学号_segment = segments[1]
            results.append(学号_segment)
        else:
            # 如果没有足够的分段，记录错误
            results.append("ERROR: 文件名格式不符合要求")

    return results


"""
返回文件名称中的日期部分
"""


def get_日期_segment(file_paths):
    results = []

    for file_path in file_paths:

        # 分割文件名
        segments = file_path.split('.')

        # 检查是否有足够的段
        if len(segments) >= 2:
            # 获取第二段（索引为1）
            second_segment = segments[1]
            results.append(second_segment)
        else:
            # 如果没有足够的分段，记录错误
            results.append("ERROR: 文件名格式不符合要求")

    cleaned = [re.sub(r'-+$', '', s) for s in results]

    return cleaned


"""
判断字符串list中是否有重复内容
"""


def find_duplicates(items):
    """查找并打印列表中的重复项"""
    seen = set()
    duplicates = set()

    for item in items:
        if item in seen:
            duplicates.add(item)
        else:
            seen.add(item)

    if duplicates:
        print(f"列表中有 {len(duplicates)} 个重复项:")
        for i, dup in enumerate(duplicates, 1):
            print(f"{i}. {dup} (出现次数: {items.count(dup)})")
        return True
    else:
        return False


"""
显示出现的所有的日期
"""


def show_all_date(lst):
    print(sorted(set(lst)))


def _计算上机成绩(from_name="学生名单", to_name="上机报告1"):
    folder = f"{base_path}/{to_name}"

    files = get_docx_files(folder)
    for file in files:
        print(file)

    学号_list = get_学号_segment(files)
    学号_list = [int(x) for x in 学号_list]

    # 姓名_list = get_姓名_segment(files)
    日期_list = get_日期_segment(files)
    date_list = tools.convert_xxyy_to_date(日期_list)
    成绩_list = tools.calculate_date_scores(date_list, base_score=22)

    print(成绩_list)

    output_file = tools.merge_student_scores(
        excel_path=f"{base_path}/{from_name}.xlsx",
        student_ids=学号_list,
        scores=成绩_list,
        output_path=f"{base_path}/{to_name}.xlsx",
        student_id_col='学号',
        new_score_col=to_name)
    df_result = pd.read_excel(output_file)
    print(df_result)


# 使用示例
if __name__ == "__main__":
    base_path = BASE_PATH_5G生态应用技术
    _计算上机成绩("学生名单", "上机报告1")
    _计算上机成绩("上机报告1", "上机报告2")
    _计算上机成绩("上机报告2", "上机报告3")
    _计算上机成绩("上机报告3", "上机报告4")

    filled_df = tools.fill_empty_cells(
        input_file=f"{base_path}/上机报告4.xlsx",
        output_file=f"{base_path}/上机报告4_填充后.xlsx",  # 指定输出文件
        start_col=2,
        end_col=5,
        fill_value=0
    )

    # Deleting a file
    os.remove(f"{base_path}/上机报告1.xlsx")
    os.remove(f"{base_path}/上机报告2.xlsx")
    os.remove(f"{base_path}/上机报告3.xlsx")
    os.remove(f"{base_path}/上机报告4.xlsx")
    print("File removed successfully")
